package com.itheima.d11_api_objects;

import java.util.Objects;

/**
 *Objects是一个工具类，提供了很多操作对象的静态方法给我们使用。
 * public static boolean equals(Object a, Object b)  先做非空判断，再比较两个对象
 * public static boolean isNull(Object obj)   判断对象是否为null，为null返回true ,反之
 * public static boolean nonNull(Object obj)   判断对象是否不为null，不为null则返回true, 反之
 *
 * 源码分析：
 * public static boolean equals(Object a, Object b) {
 * return (a == b) || (a != null && a.equals(b));
 * 先比较地址是否一样，然后再判断是否为null，如果地址不同是两个对象并且不为空，才会调用equals方法进行比较
 * }
 * a.equals(b) 调用的equals方法源码：
 * public boolean equals(Object obj) {
 *         return (this == obj);
 *     }
 *
 * 为什么要使用Objects类提供的equals方法来比较两个对象？
 * 更安全。
 */
public class Test {
    public static void main(String[] args) {
        // 目标：掌握Objects类提供的常用方法。
        String s1 = null;
        String s2 = "itheima";

        //这里会出现NullPointerException异常，调用者不能为null,空指针异常，不能比较
        //System.out.println(s1.equals(s2));
        //不会报错，此时不会有NullPointerException异常，底层会自动先判断空。可以进行比较，更安全，更好的！
        System.out.println(Objects.equals(s1, s2));

        System.out.println(Objects.isNull(s1)); // true
        //isnull可以用==来代替实现效果，看isnull底层源码就知道了
        System.out.println(s1 == null); // true
        System.out.println(Objects.isNull(s2)); // false
        System.out.println(s2 == null );// false

        System.out.println(Objects.nonNull(s1)); // false
        System.out.println(Objects.nonNull(s2)); // true

        System.out.println("============");

        String s3 = "zengjihong";
        String s4 = "zengjihong";
        System.out.println(s3.equals(s4));
        System.out.println(Objects.equals(s3, s4));
    }
}
